package com.huanzhidadi.single.proxy;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;

/**
 * JDK动态代理，基于接口
 */
public class JDKProxyTest {
    public static void main(String[] args) {
        // 1. 创建被代理的对象，ProxyInterface接口的实现类
        RealObject realObject = new RealObject();

        // 2. 获取对应的 ClassLoader
        ClassLoader classLoader = ProxyInterface.class.getClassLoader();
        // ClassLoader classLoader = realObject.getClass().getClassLoader();

        // 3. 获取所有接口的Class，这里的RealObject只实现了一个接口ProxyInterface，
        Class[] interfaces = new Class[]{ProxyInterface.class};
        // Class[] interfaces = realObject.getClass().getInterfaces();

        // 4. 创建一个将传给代理类的调用请求处理器，处理所有的代理对象上的方法调用
        InvocationHandler handler = new ProxyObject(realObject);

        // 5.根据上面提供的信息，创建代理对象
        ProxyInterface proxy = (ProxyInterface) Proxy.newProxyInstance(classLoader, interfaces, handler);

        // 6.调用代理的方法
        proxy.say();
    }
}

interface ProxyInterface {
    void say();
}

// 被代理类
class RealObject implements ProxyInterface {
    @Override
    public void say() {
        System.out.println("被代理类 say");
    }
}

//代理类，实现InvocationHandler 接口
class ProxyObject implements InvocationHandler {
    // 被代理的对象
    private Object target = null;
    public ProxyObject(){

    }
    public ProxyObject(Object target){
        this.target  = target;
    }

    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        System.out.println("代理类 say hello");
        // 调用 target 的 method 方法
        return method.invoke(target, args);
    }
}